/*
* Copyright 2012 EMBL - European Bioinformatics Institute
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package uk.ac.ebi.fg.annotare2.magetabcheck.efo;
import com.google.common.io.Files;
import com.google.common.io.Resources;
import org.semanticweb.HermiT.Reasoner;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.reasoner.InferenceType;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import static com.google.common.io.Closeables.close;
/**
* @author Olga Melnichuk
*/
public class EfoLoader {
private static final Logger log = LoggerFactory.getLogger(EfoLoader.class);
private File cacheDir;
private final URL defaultEfoUrl;
private final int entityExpansionLimit;
public EfoLoader(EfoServiceProperties properties) {
if (properties == null) {
throw new IllegalArgumentException("EfoServiceProperties == null");
}
defaultEfoUrl = properties.getEfoUrl();
entityExpansionLimit = properties.getOwlEntityExpansionLimit();
cacheDir = properties.getCacheDir();
cacheDir = (cacheDir == null) ?
Files.createTempDir() : cacheDir;
log.debug("EFO cache dir used {}", cacheDir);
}
public EfoDag load() throws IOException, OWLOntologyCreationException {
return load(defaultEfoUrl);
}
public EfoDag load(final URL url) throws IOException, OWLOntologyCreationException {
if (url == null) {
log.error("Given EFO url is null; please use the config file to specify the proper one");
return null;
}
File cacheFile = getCacheFile(url);
if (!cacheFile.exists()) {
log.debug("The cache file doesn't exist; creating one [file={}]", cacheFile);
if (!cacheDir.exists() && !cacheDir.mkdirs()) {
throw new IOException("Can't create EFO cache directory: " + cacheDir.getAbsolutePath());
}
log.debug("Downloading EFO file [url={}]", url);
Resources.asByteSource(url).copyTo(Files.asByteSink(cacheFile));
log.debug("EFO file download successfully completed.");
} else {
log.debug("Loading EFO graph from cache [file={}]", cacheFile);
}
return load(cacheFile);
}
private File getCacheFile(URL url) {
String fileName = url.toString().replaceAll("[^\\p{L}\\p{N}]", "");
fileName = fileName.replaceAll("http|www", "");
fileName = fileName.substring(0, Math.min(30, fileName.length()));
return new File(cacheDir, fileName + ".cache");
}
public EfoDag load(File file) throws IOException, OWLOntologyCreationException {
InputStream in = null;
try {
in = new FileInputStream(file);
return load(in);
} finally {
close(in, true);
}
}
public EfoDag load(InputStream in) throws OWLOntologyCreationException {
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLReasoner reasoner = null;
try {
// The default entityExpansionLimit=64000 defined in RDFXMLParser
// is not enough to load EFO
System.setProperty("entityExpansionLimit", Integer.toString(entityExpansionLimit));
log.debug("Reading the ontology...");
OWLOntology ontology = manager.loadOntologyFromOntologyDocument(in);
reasoner = new Reasoner.ReasonerFactory().createReasoner(ontology);
reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY);
reasoner.isConsistent();
return EfoDag.build(ontology, reasoner);
} finally {
if (reasoner != null) {
reasoner.dispose();
}
}
}
}